import fs from 'fs/promises';
import path from 'path';
import { PGlite } from '@electric-sql/pglite';
import dotenv from 'dotenv';

// 加载环境变量
dotenv.config();

async function applyMigrationsToPGlite() {
  console.log('正在应用迁移到 PGlite 数据库...');
  
  // 获取数据库 URL
  const dbUrl = process.env.POSTGRES_URL;
  if (!dbUrl) {
    throw new Error('未设置 POSTGRES_URL 环境变量');
  }
  
  // 检查是否为 PGlite URL
  const isPGliteUrl = dbUrl.startsWith('pglite://');
  if (!isPGliteUrl) {
    throw new Error('这个脚本仅适用于 PGlite 数据库。请更新 POSTGRES_URL 以使用 pglite:// 协议。');
  }
  
  // 配置 PGlite 选项
  const options = { dataDir: dbUrl.replace('pglite://', '') };
  
  // 初始化 PGlite 客户端
  console.log('正在初始化 PGlite...');
  const db = new PGlite(options);
  
  // 获取迁移文件
  const migrationsDir = path.join(process.cwd(), 'lib/db/migrations');
  const migrationFiles = (await fs.readdir(migrationsDir))
    .filter(file => file.endsWith('.sql'))
    .sort();
  
  if (migrationFiles.length === 0) {
    console.log('未找到迁移文件。请先运行 pnpm db:generate 生成迁移。');
    return;
  }
  
  console.log(`找到 ${migrationFiles.length} 个迁移文件：`);
  migrationFiles.forEach(file => console.log(`- ${file}`));
  
  // 读取并应用每个迁移文件
  for (const file of migrationFiles) {
    console.log(`\n应用迁移：${file}`);
    const migrationPath = path.join(migrationsDir, file);
    const migrationSql = await fs.readFile(migrationPath, 'utf-8');
    
    // 按 statement-breakpoint 分割 SQL 语句
    const statements = migrationSql.split('--> statement-breakpoint')
      .map(stmt => stmt.trim())
      .filter(stmt => stmt.length > 0);
    
    console.log(`迁移文件包含 ${statements.length} 个 SQL 语句`);
    
    // 应用每个 SQL 语句
    for (let i = 0; i < statements.length; i++) {
      try {
        const stmt = statements[i];
        console.log(`执行语句 ${i + 1}/${statements.length}...`);
        await db.query(stmt);
      } catch (error) {
        console.error(`执行 SQL 语句时出错：`, error);
        console.log('继续执行下一个语句...');
      }
    }
    
    console.log(`迁移 ${file} 已应用`);
  }
  
  console.log('\n所有迁移已成功应用到 PGlite 数据库！');
}

// 运行迁移
applyMigrationsToPGlite().catch(error => {
  console.error('应用迁移时发生错误：', error);
  process.exit(1);
}); 